自宅のルータ(Yamahaルータ)のモニタリングをNew Relicで行えるようにしてみた
初めに
しばらく前に自宅のサーバ周りのモニタリングをNew Relicに集約するようにしましたが、ふとした時にルーター周りがまだ個別に確認が必要な状態な事に気づきました。
ただ各種サーバと違ってエージェントを設置できるわけではないので何か方法はないものかと思ったところ、SNMPというプロトコルを利用することで実現できそうでしたのでこちらを利用してNew Relic上にデータを上げて閲覧できるようにしてみました。
なお本記事の作業は理解が薄い状態で実施している関係でとりあえず動くという設定も含まれています。その関係で不適切な設定が混じっている可能性もありますのでご注意ください。
環境
- AlmaLinux 9
- 正確にはこのホスト上のDocker
- Yamaha RTX 830
- Rev 15.02.28
ルータ側の設定
SNMPにはいくつかのバージョンがあるようですが基本的には後続の方がセキュリティや機能面で優れているようなのでSNMPv3で設定します。
以下のドキュメントを元に設定しています。
snmp local address {{ルータのIFのIP}} snmp trap enable snmp all snmp sysname home-router-master snmpv3 context name home-router snmpv3 usm user 1 new-relic-watcher group 1 sha {{パスワード}} aes128-cfb {{パスワード}} snmpv3 trap host {{AlmaLinuxのホスト名}} user 1 snmpv3 host {{AlmaLinuxのホスト名}} user 1 snmpv3 vacm view 1 include 1.3.6.1 snmpv3 vacm access 1 read 1 write none
ログ(SYSLOG)に関しては別のプロトコルとなるようなのでこちらも設定しておきます。
syslog host {{AlmaLinuxのホスト名}}
コレクタ側のベース設定取得
SNMPマネージャーとして利用可能なコンテナがあるようなのでそちらで対応します。
New Relicのウィザードを通して必要な値を入力することで必要なファイルやコマンドまで生成してくれるようです。
ただそのままだと今回の環境に合致しないためか動かないような部分があったので最終的には手で修正はしています。
「Add Data」から「SNMP」を選択します。
Dockerで起動させたいので「Docker」を選択します。
設定値は後の設定コマンドの出力に使われますがパラメータについては後々変更できるので適当に埋めてます。
設定や切れてしまっていますが実行に必要なコマンドが出力されるので、これを元に起動準備をします。
コレクターの設定
先ほど記載の設定をもとにAlmaLinux上で実行する収集コンテナの設定を作成します。
必要なdocker run
コマンドが提示されていましたが個人的にはdocker-compose.yml
にまとめておくのが好きなので元のコマンドを参考に記述して設置しておきます。
ほぼほぼ引数の違いなのでエイリアス/アンカーでもう少しスマートに書けそうな気もしますし、いっそのこと1コンテナにならないかとも思っていますがひとまずはこれで動かします。
Syslog側も同様にウィザードで生成されるコマンドを参考にしています。
version: "3.9" services: SnmpManager: image: kentik/ktranslate:v2 container_name: snmp-manager restart: unless-stopped ports: - "162:1620/udp" volumes: - ./snmp-base.yaml:/snmp-base.yaml # 後述します - ./profiles:/etc/ktranslate/profiles environment: NEW_RELIC_API_KEY: xxxxx command: - -snmp=/snmp-base.yaml - -nr_account_id=xxxxx - -metrics=jchf - -tee_logs=true - -service_name=router-snmp - -snmp_discovery_on_start=true - -snmp_discovery_min=60 - nr1.snmp SyslogManager: image: kentik/ktranslate:v2 container_name: syslog-manager restart: unless-stopped ports: - "514:5143/udp" volumes: - ./snmp-base.yaml:/snmp-base.yaml environment: NEW_RELIC_API_KEY: xxxxx command: - -snmp=/snmp-base.yaml - -nr_account_id=xxxxxx - -metrics=jchf - -tee_logs=true - -service_name=router-syslog - -snmp_discovery_min=60 - nr1.syslog
先ほどのコンテナのコンテンツ用の設定ファイル(?)も同様に設置して起動します。
起動後の処理で色々加筆されるようなので最終形は異なりますがこれで動くはずです(記憶の限り復元)。
devices: {} trap: listen: 0.0.0.0:1620 community: "" version: v3 transport: "" v3_config: user_name: new-relic-watcher authentication_protocol: SHA authentication_passphrase: xxxxx privacy_protocol: AES privacy_passphrase: xxxxx context_name: home-router trap_only: false discovery: cidrs: - {{ルーターのIP}}/32 ignore_list: [] ports: - 161 default_communities: [] use_snmp_v1: false default_v3: user_name: new-relic-watcher authentication_protocol: SHA authentication_passphrase: xxxxx privacy_protocol: AES privacy_passphrase: xxxxx context_name: home-router add_devices: true add_mibs: true threads: 4 replace_devices: true check_all_ips: true kentik: null global: poll_time_sec: 300 mib_profile_dir: /etc/ktranslate/profiles mibs_enabled: - IF-MIB timeout_ms: 3000 retries: 0
設定変更に関して必要なパラメータは以下を参照しています。
実行します。
docker compose up -d
仮確認
CPU利用率諸々等表示されないですがひとまずデータは上がっていることが確認できました。
表示されなかった項目
SNMPのモニタリング情報はMIBという規格で取得されるようです。
これには標準で提供されるようなパラメータと各社が拡張したパラメータがあるようですが、以下の資料(同社別製品のSWですが)をみる限り標準ではCPU使用率やメモリの使用率が含まれていないようです。
今回の収集を行っているコンテナには以下に設置されているような幾つかのベンダーのプロファイルは含まれているようですが、Yamaha製品は含まれていないため独自でプロファイルを作成し拡張する必要があります。
独自プロファイルの作成
Yamaha製品のプライベートMIBのファイルは以下から取得が可能です。
ただ今回のコレクタに読み込ませるにはそのままではダメで特定の形式に変換をする必要があるので以下のNew Relicのブログを参考にプロファイルを作成します。
とりあえずCPU・メモリ利用率あたりとついでの作業で取れそうなものを設定してみます。
作業はMacOS上で行ってます。
#NOTE: 別途先ほどのyamaha-private-mib.zipをダウンロードして解凍済み # ~/git/ディレクトリ上で作業しています。 pip install pysmi git clone [email protected]:librenms/librenms.git git clone [email protected]:kentik/snmp-profiles.git mkdir snmp-profiles/profiles/kentik_snmp/yamaha/ cd yamaha-private-mib #末尾が.txtだとうまく動かなかったので.txtを全て除去しておく rename "s/.txt//g" ./* mibdump.py --mib-source ../librenms/mibs --mib-source ./ --destination-format json --destination-directory ../snmp-profiles/profiles/kentik_snmp/yamaha/ yamaha-rt-hardware.mib # $ ls ~/git/snmp-profiles/profiles/kentik_snmp/yamaha # YAMAHA-RT-HARDWARE.json YAMAHA-RT.json YAMAHA-SMI.json docker run --rm -v ~/git/snmp-profiles/profiles/kentik_snmp/yamaha/:/snmp_out kentik/ktranslate:v2 -snmp /etc/ktranslate/snmp-base.yaml -snmp_json2yaml /snmp_out/YAMAHA-RT-HARDWARE.json
変換が終わって生成されたyamlを見てみるjson時点では存在したようなパラメータが落ちていたり、extends
やsysobjectid
もなかったので書き足します。
# Autogenerated by ktranslate on Wed Nov 8 17:34:01 UTC 2023 from YAMAHA-RT-HARDWARE.json # 他のものをを見る限り大体この2つ固定だった。共通MIBっぽい感じがする extends: - system-mib.yml - if-mib.yml # 雰囲気ハードウェアのoidな気がするのでとりあえずそれで sysobjectid: - 1.3.6.1.4.1.1182.1.53 metrics: - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.1 name: yrhCpuType walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.17 name: yrhEnableSystemAlarmTrap walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.3 name: yrhFlashROMSize walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.2 name: yrhMemorySize walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.19 name: yrhMemorySizeMB walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.16 name: yrhSystemAlarm walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.4 name: yrhMemoryUtil walk_full_table: false - MIB: YAMAHA-RT-HARDWARE symbol: OID: 1.3.6.1.4.1.1182.2.1.6 name: yrhCpuUtil1min walk_full_table: false no_use_bulkwalkall: false matches: {} matches_list: [] sysmap: {}
今回は一旦CPU/メモリ利用率が取れれば良かったので変換せず直接書いて生成で良かった気もしますが一旦はよしとしましょう。
再確認
先ほどのsnmp-profiles/profiles/
をAlmaLinux上のdocker-compose.yml
と同階層に設置して起動しなおします。
順序が前後していますが先に記載したdocker-compose.yml
にはすでにprofilesをマウントするように設定が書いてあります。
起動してしばらくするとNew Relic側のCurrently Collected Metrics
で先ほど追加したパラメータが増えていることがわかります。
Summary上の直近の使用率の表示はクエリがkentik.snmp.MemoryUtilization
を参照しているため引き続きNo Valueですが、kentik.snmp.yrhMemoryUtil
を参照するようにクエリを実行してみるとメモリ使用率が取れることが確認できます。
終わりに
まだ諸々調整するような部分はありますが無事に必要なパラメータを収集してNew Relic上で閲覧できるところまで設定することができました。
実のところ始める前は「よくわからないけどウィザードもあるしサクッと設定して動くでしょ」と思っていましたが、あちこちでハマって結局それなりに時間は掛かってしまいました。
engine id
の不一致によるエラー- マネージャー側必須ではないみたいでyml側未設定で解決(根本解決はしていない)
- snmpv3使うだけの予定がデフォルトの設定だとsnmpv2cが飛び続ける
- ウィザードに沿って作成すると含まれる
default_communities
が原因
- ウィザードに沿って作成すると含まれる
- CPU/メモリがNo Valueのままでそもそも何のパラメータが取得されてるかすらわからなかった
- MIBをふわっと理解してなんとか解決
ただこれでちょっとSNMPわかって設定できそうな部分も増えましたしいい学びにはなったかと思います。
New Relicもまだまだ使いこなせてないところはありますのでもっといい感じに使っていけるように頑張ります。